#ifndef cathlibcpp_tpltutil_H
#define cathlibcpp_tpltutil_H

// File:       tpltutil.h
// Author:     (c) Miles Sabin, 1997
// Purpose:    macros to ease instantiation of template classes and
//             out of line template free fns


#define _ ,

#define __tempname(nm)         __tempname2(nm, __LINE__)
#define __tempname2(nm, line)  __tempname3(nm, line)
#define __tempname3(nm, line)  nm ## line


#define INSTANTIATE_CLASS_1(template_id, T0)                                             \
typedef template_id< T0 > __tempname(__instantiate_class_);

#define INSTANTIATE_CLASS_2(template_id, T0, T1)                                         \
typedef template_id< T0, T1 > __tempname(__instantiate_class_);

#define INSTANTIATE_CLASS_3(template_id, T0, T1, T2)                                     \
typedef template_id< T0, T1, T2 > __tempname(__instantiate_class_);

#define INSTANTIATE_CLASS_4(template_id, T0, T1, T2, T3)                                 \
typedef template_id< T0, T1, T2, T3 > __tempname(__instantiate_class_);

#define INSTANTIATE_CLASS_5(template_id, T0, T1, T2, T3, T4)                             \
typedef template_id< T0, T1, T2, T3, T4 > __tempname(__instantiate_class_);

#define INSTANTIATE_CLASS_6(template_id, T0, T1, T2, T3, T4, T5)                         \
typedef template_id< T0, T1, T2, T3, T4, T5 > __tempname(__instantiate_class_);


#define INSTANTIATE_FN_1(fn, T0)                                                         \
static void __tempname(__instantiate_fn_)(T0 t0)                                         \
{                                                                                        \
  fn(t0);                                                                                \
}

#define INSTANTIATE_FN_2(fn, T0, T1)                                                     \
static void __tempname(__instantiate_fn_)(T0 t0, T1 t1)                                  \
{                                                                                        \
  fn(t0, t1);                                                                            \
}

#define INSTANTIATE_FN_3(fn, T0, T1, T2)                                                 \
static void __tempname(__instantiate_fn_)(T0 t0, T1 t1, T2 t2)                           \
{                                                                                        \
  fn(t0, t1, t2);                                                                        \
}

#define INSTANTIATE_FN_4(fn, T0, T1, T2, T3)                                             \
static void __tempname(__instantiate_fn_)(T0 t0, T1 t1, T2 t2, T3 t3)                    \
{                                                                                        \
  fn(t0, t1, t2, t3);                                                                    \
}

#define INSTANTIATE_FN_5(fn, T0, T1, T2, T3, T4)                                         \
static void __tempname(__instantiate_fn_)(T0 t0, T1 t1, T2 t2, T3 t3, T4 t4)             \
{                                                                                        \
  fn(t0, t1, t2, t3, t4);                                                                \
}

#define INSTANTIATE_FN_6(fn, T0, T1, T2, T3, T4, T5)                                     \
static void __tempname(__instantiate_fn_)(T0 t0, T1 t1, T2 t2, T3 t3, T4 t4, T5 t5)      \
{                                                                                        \
  fn(t0, t1, t2, t3, t4, t5);                                                            \
}

#endif
